/**
 * 数字格式化工具函数
 */

/**
 * 格式化数字为千分号格式
 * @param value 要格式化的数值
 * @param options 格式化选项
 * @returns 格式化后的字符串
 */
export const formatNumberWithCommas = (
  value: number | string | null | undefined,
  options: {
    minimumFractionDigits?: number
    maximumFractionDigits?: number
    locale?: string
    currency?: string
  } = {}
): string => {
  const {
    minimumFractionDigits = 0,
    maximumFractionDigits = 2,
    locale = 'zh-CN',
    currency
  } = options

  // 处理空值
  if (value === null || value === undefined || value === '') {
    return '--'
  }

  // 转换为数字
  const num = typeof value === 'string' ? parseFloat(value) : value

  // 检查是否为有效数字
  if (isNaN(num)) {
    return '--'
  }

  // 如果有货币符号，使用货币格式化
  if (currency) {
    return num.toLocaleString(locale, {
      style: 'currency',
      currency,
      minimumFractionDigits,
      maximumFractionDigits
    })
  }

  // 普通数字格式化
  return num.toLocaleString(locale, {
    minimumFractionDigits,
    maximumFractionDigits
  })
}

/**
 * 格式化价格（人民币）
 * @param value 价格数值
 * @param showCurrency 是否显示货币符号
 * @returns 格式化后的价格字符串
 */
export const formatPrice = (
  value: number | string | null | undefined,
  showCurrency: boolean = false
): string => {
  if (showCurrency) {
    return formatNumberWithCommas(value, {
      minimumFractionDigits: 2,
      maximumFractionDigits: 2,
      currency: 'CNY'
    })
  }
  
  return formatNumberWithCommas(value, {
    minimumFractionDigits: 2,
    maximumFractionDigits: 2
  })
}

/**
 * 格式化百分比
 * @param value 百分比数值（0-1之间的小数）
 * @param options 格式化选项
 * @returns 格式化后的百分比字符串
 */
export const formatPercentage = (
  value: number | string | null | undefined,
  options: {
    minimumFractionDigits?: number
    maximumFractionDigits?: number
    showSymbol?: boolean
  } = {}
): string => {
  const {
    minimumFractionDigits = 0,
    maximumFractionDigits = 2,
    showSymbol = true
  } = options

  if (value === null || value === undefined || value === '') {
    return '--'
  }

  const num = typeof value === 'string' ? parseFloat(value) : value

  if (isNaN(num)) {
    return '--'
  }

  // 转换为百分比（乘以100）
  const percentage = num * 100

  const formatted = percentage.toLocaleString('zh-CN', {
    minimumFractionDigits,
    maximumFractionDigits
  })

  return showSymbol ? `${formatted}%` : formatted
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @param decimals 小数位数
 * @returns 格式化后的文件大小字符串
 */
export const formatFileSize = (bytes: number, decimals: number = 2): string => {
  if (bytes === 0) return '0 Bytes'

  const k = 1024
  const dm = decimals < 0 ? 0 : decimals
  const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']

  const i = Math.floor(Math.log(bytes) / Math.log(k))

  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
} 
